home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / print / PSPrinterJob.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  22.3 KB  |  1,125 lines

  1. package sun.print;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.FontMetrics;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.GraphicsEnvironment;
  9. import java.awt.HeadlessException;
  10. import java.awt.Shape;
  11. import java.awt.font.FontRenderContext;
  12. import java.awt.geom.AffineTransform;
  13. import java.awt.geom.PathIterator;
  14. import java.awt.geom.Rectangle2D;
  15. import java.awt.image.BufferedImage;
  16. import java.awt.print.PageFormat;
  17. import java.awt.print.Paper;
  18. import java.awt.print.Printable;
  19. import java.awt.print.PrinterException;
  20. import java.awt.print.PrinterIOException;
  21. import java.awt.print.PrinterJob;
  22. import java.io.BufferedInputStream;
  23. import java.io.BufferedOutputStream;
  24. import java.io.File;
  25. import java.io.FileInputStream;
  26. import java.io.FileOutputStream;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.io.OutputStream;
  30. import java.io.PrintStream;
  31. import java.nio.ByteBuffer;
  32. import java.nio.CharBuffer;
  33. import java.nio.charset.CharsetEncoder;
  34. import java.nio.charset.CoderMalfunctionError;
  35. import java.security.AccessController;
  36. import java.util.ArrayList;
  37. import java.util.Locale;
  38. import java.util.Properties;
  39. import javax.print.PrintService;
  40. import javax.print.StreamPrintService;
  41. import javax.print.attribute.HashPrintRequestAttributeSet;
  42. import javax.print.attribute.standard.Copies;
  43. import javax.print.attribute.standard.Destination;
  44. import javax.print.attribute.standard.JobName;
  45. import javax.print.attribute.standard.Sides;
  46. import sun.awt.CharsetString;
  47. import sun.awt.FontConfiguration;
  48. import sun.awt.PlatformFont;
  49. import sun.awt.SunToolkit;
  50. import sun.font.FontManager;
  51.  
  52. public class PSPrinterJob extends RasterPrinterJob {
  53.    protected static final int FILL_EVEN_ODD = 1;
  54.    protected static final int FILL_WINDING = 2;
  55.    private static final int MAX_PSSTR = 65535;
  56.    private static final int RED_MASK = 16711680;
  57.    private static final int GREEN_MASK = 65280;
  58.    private static final int BLUE_MASK = 255;
  59.    private static final int RED_SHIFT = 16;
  60.    private static final int GREEN_SHIFT = 8;
  61.    private static final int BLUE_SHIFT = 0;
  62.    private static final int LOWNIBBLE_MASK = 15;
  63.    private static final int HINIBBLE_MASK = 240;
  64.    private static final int HINIBBLE_SHIFT = 4;
  65.    private static final byte[] hexDigits = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70};
  66.    private static final int PS_XRES = 300;
  67.    private static final int PS_YRES = 300;
  68.    private static final String ADOBE_PS_STR = "%!PS-Adobe-3.0";
  69.    private static final String EOF_COMMENT = "%%EOF";
  70.    private static final String PAGE_COMMENT = "%%Page: ";
  71.    private static final String READIMAGEPROC = "/imStr 0 def /imageSrc {currentfile /ASCII85Decode filter /RunLengthDecode filter  imStr readstring pop } def";
  72.    private static final String COPIES = "/#copies exch def";
  73.    private static final String PAGE_SAVE = "/pgSave save def";
  74.    private static final String PAGE_RESTORE = "pgSave restore";
  75.    private static final String SHOWPAGE = "showpage";
  76.    private static final String IMAGE_SAVE = "/imSave save def";
  77.    private static final String IMAGE_STR = " string /imStr exch def";
  78.    private static final String IMAGE_RESTORE = "imSave restore";
  79.    private static final String COORD_PREP = " 0 exch translate 1 -1 scale[72 300 div 0 0 72 300 div 0 0]concat";
  80.    private static final String SetFontName = "F";
  81.    private static final String DrawStringName = "S";
  82.    private static final String EVEN_ODD_FILL_STR = "EF";
  83.    private static final String WINDING_FILL_STR = "WF";
  84.    private static final String EVEN_ODD_CLIP_STR = "EC";
  85.    private static final String WINDING_CLIP_STR = "WC";
  86.    private static final String MOVETO_STR = " M";
  87.    private static final String LINETO_STR = " L";
  88.    private static final String CURVETO_STR = " C";
  89.    private static final String GRESTORE_STR = "R";
  90.    private static final String GSAVE_STR = "G";
  91.    private static final String NEWPATH_STR = "N";
  92.    private static final String CLOSEPATH_STR = "P";
  93.    private static final String SETRGBCOLOR_STR = " SC";
  94.    private static final String SETGRAY_STR = " SG";
  95.    private int mDestType;
  96.    private String mDestination = "lp";
  97.    private boolean mNoJobSheet = false;
  98.    private String mOptions;
  99.    private Font mLastFont;
  100.    private Color mLastColor;
  101.    private Shape mLastClip;
  102.    private AffineTransform mLastTransform;
  103.    private EPSPrinter epsPrinter = null;
  104.    FontMetrics mCurMetrics;
  105.    PrintStream mPSStream;
  106.    File spoolFile;
  107.    private String mFillOpStr = "WF";
  108.    private String mClipOpStr = "WC";
  109.    ArrayList mGStateStack = new ArrayList();
  110.    private float mPenX;
  111.    private float mPenY;
  112.    private float mStartPathX;
  113.    private float mStartPathY;
  114.    private static Properties mFontProps = null;
  115.  
  116.    private static Properties initProps() {
  117.       String var0 = System.getProperty("java.home");
  118.       if (var0 != null) {
  119.          String var1 = SunToolkit.getStartupLocale().getLanguage();
  120.  
  121.          try {
  122.             File var2 = new File(var0 + File.separator + "lib" + File.separator + "psfontj2d.properties." + var1);
  123.             if (!var2.canRead()) {
  124.                var2 = new File(var0 + File.separator + "lib" + File.separator + "psfont.properties." + var1);
  125.                if (!var2.canRead()) {
  126.                   var2 = new File(var0 + File.separator + "lib" + File.separator + "psfontj2d.properties");
  127.                   if (!var2.canRead()) {
  128.                      var2 = new File(var0 + File.separator + "lib" + File.separator + "psfont.properties");
  129.                      if (!var2.canRead()) {
  130.                         return (Properties)null;
  131.                      }
  132.                   }
  133.                }
  134.             }
  135.  
  136.             BufferedInputStream var3 = new BufferedInputStream(new FileInputStream(var2.getPath()));
  137.             Properties var4 = new Properties();
  138.             var4.load(var3);
  139.             ((InputStream)var3).close();
  140.             return var4;
  141.          } catch (Exception var5) {
  142.             return (Properties)null;
  143.          }
  144.       } else {
  145.          return (Properties)null;
  146.       }
  147.    }
  148.  
  149.    public boolean printDialog() throws HeadlessException {
  150.       if (GraphicsEnvironment.isHeadless()) {
  151.          throw new HeadlessException();
  152.       } else {
  153.          if (this.attributes == null) {
  154.             this.attributes = new HashPrintRequestAttributeSet();
  155.          }
  156.  
  157.          this.attributes.add(new Copies(this.getCopies()));
  158.          this.attributes.add(new JobName(this.getJobName(), (Locale)null));
  159.          boolean var1 = false;
  160.          DialogTypeSelection var2 = (DialogTypeSelection)this.attributes.get(DialogTypeSelection.class);
  161.          if (var2 == DialogTypeSelection.NATIVE) {
  162.             this.attributes.remove(DialogTypeSelection.class);
  163.             var1 = this.printDialog(this.attributes);
  164.             this.attributes.add(DialogTypeSelection.NATIVE);
  165.          } else {
  166.             var1 = this.printDialog(this.attributes);
  167.          }
  168.  
  169.          if (var1) {
  170.             JobName var3 = (JobName)this.attributes.get(JobName.class);
  171.             if (var3 != null) {
  172.                this.setJobName(var3.getValue());
  173.             }
  174.  
  175.             Copies var4 = (Copies)this.attributes.get(Copies.class);
  176.             if (var4 != null) {
  177.                this.setCopies(var4.getValue());
  178.             }
  179.  
  180.             Destination var5 = (Destination)this.attributes.get(Destination.class);
  181.             if (var5 != null) {
  182.                try {
  183.                   this.mDestType = 1;
  184.                   this.mDestination = (new File(var5.getURI())).getPath();
  185.                } catch (Exception var7) {
  186.                   this.mDestination = "out.ps";
  187.                }
  188.             } else {
  189.                this.mDestType = 0;
  190.                PrintService var6 = this.getPrintService();
  191.                if (var6 != null) {
  192.                   this.mDestination = var6.getName();
  193.                }
  194.             }
  195.          }
  196.  
  197.          return var1;
  198.       }
  199.    }
  200.  
  201.    protected void startDoc() throws PrinterException {
  202.       if (this.epsPrinter == null) {
  203.          Object var1;
  204.          if (this.getPrintService() instanceof PSStreamPrintService) {
  205.             StreamPrintService var2 = (StreamPrintService)this.getPrintService();
  206.             this.mDestType = 2;
  207.             if (var2.isDisposed()) {
  208.                throw new PrinterException("service is disposed");
  209.             }
  210.  
  211.             var1 = var2.getOutputStream();
  212.             if (var1 == null) {
  213.                throw new PrinterException("Null output stream");
  214.             }
  215.          } else {
  216.             this.mNoJobSheet = super.noJobSheet;
  217.             if (super.destinationAttr != null) {
  218.                this.mDestType = 1;
  219.                this.mDestination = super.destinationAttr;
  220.             }
  221.  
  222.             if (this.mDestType == 1) {
  223.                try {
  224.                   this.spoolFile = new File(this.mDestination);
  225.                   var1 = new FileOutputStream(this.spoolFile);
  226.                } catch (IOException var7) {
  227.                   throw new PrinterIOException(var7);
  228.                }
  229.             } else {
  230.                PrinterOpener var8 = new PrinterOpener(this, (1)null);
  231.                AccessController.doPrivileged(var8);
  232.                if (var8.pex != null) {
  233.                   throw var8.pex;
  234.                }
  235.  
  236.                var1 = var8.result;
  237.             }
  238.          }
  239.  
  240.          this.mPSStream = new PrintStream(new BufferedOutputStream((OutputStream)var1));
  241.          this.mPSStream.println("%!PS-Adobe-3.0");
  242.       }
  243.  
  244.       this.mPSStream.println("%%BeginProlog");
  245.       this.mPSStream.println("/imStr 0 def /imageSrc {currentfile /ASCII85Decode filter /RunLengthDecode filter  imStr readstring pop } def");
  246.       this.mPSStream.println("/BD {bind def} bind def");
  247.       this.mPSStream.println("/D {def} BD");
  248.       this.mPSStream.println("/C {curveto} BD");
  249.       this.mPSStream.println("/L {lineto} BD");
  250.       this.mPSStream.println("/M {moveto} BD");
  251.       this.mPSStream.println("/R {grestore} BD");
  252.       this.mPSStream.println("/G {gsave} BD");
  253.       this.mPSStream.println("/N {newpath} BD");
  254.       this.mPSStream.println("/P {closepath} BD");
  255.       this.mPSStream.println("/EC {eoclip} BD");
  256.       this.mPSStream.println("/WC {clip} BD");
  257.       this.mPSStream.println("/EF {eofill} BD");
  258.       this.mPSStream.println("/WF {fill} BD");
  259.       this.mPSStream.println("/SG {setgray} BD");
  260.       this.mPSStream.println("/SC {setrgbcolor} BD");
  261.       this.mPSStream.println("/ISOF {");
  262.       this.mPSStream.println("     dup findfont dup length 1 add dict begin {");
  263.       this.mPSStream.println("             1 index /FID eq {pop pop} {D} ifelse");
  264.       this.mPSStream.println("     } forall /Encoding ISOLatin1Encoding D");
  265.       this.mPSStream.println("     currentdict end definefont");
  266.       this.mPSStream.println("} BD");
  267.       this.mPSStream.println("/NZ {dup 1 lt {pop 1} if} BD");
  268.       this.mPSStream.println("/S {");
  269.       this.mPSStream.println("     moveto 1 index stringwidth pop NZ sub");
  270.       this.mPSStream.println("     1 index length 1 sub NZ div 0");
  271.       this.mPSStream.println("     3 2 roll ashow newpath} BD");
  272.       this.mPSStream.println("/FL [");
  273.       if (mFontProps == null) {
  274.          this.mPSStream.println(" /Helvetica ISOF");
  275.          this.mPSStream.println(" /Helvetica-Bold ISOF");
  276.          this.mPSStream.println(" /Helvetica-Oblique ISOF");
  277.          this.mPSStream.println(" /Helvetica-BoldOblique ISOF");
  278.          this.mPSStream.println(" /Times-Roman ISOF");
  279.          this.mPSStream.println(" /Times-Bold ISOF");
  280.          this.mPSStream.println(" /Times-Italic ISOF");
  281.          this.mPSStream.println(" /Times-BoldItalic ISOF");
  282.          this.mPSStream.println(" /Courier ISOF");
  283.          this.mPSStream.println(" /Courier-Bold ISOF");
  284.          this.mPSStream.println(" /Courier-Oblique ISOF");
  285.          this.mPSStream.println(" /Courier-BoldOblique ISOF");
  286.       } else {
  287.          int var9 = Integer.parseInt(mFontProps.getProperty("font.num", "9"));
  288.  
  289.          for(int var3 = 0; var3 < var9; ++var3) {
  290.             this.mPSStream.println("    /" + mFontProps.getProperty("font." + String.valueOf(var3), "Courier ISOF"));
  291.          }
  292.       }
  293.  
  294.       this.mPSStream.println("] D");
  295.       this.mPSStream.println("/F {");
  296.       this.mPSStream.println("     FL exch get exch scalefont");
  297.       this.mPSStream.println("     [1 0 0 -1 0 0] makefont setfont} BD");
  298.       this.mPSStream.println("%%EndProlog");
  299.       this.mPSStream.println("%%BeginSetup");
  300.       if (this.epsPrinter == null) {
  301.          PageFormat var10 = this.getPageable().getPageFormat(0);
  302.          double var11 = var10.getPaper().getHeight();
  303.          double var5 = var10.getPaper().getWidth();
  304.          this.mPSStream.print("<< /DeferredMediaSelection true /PageSize [" + var5 + " " + var11 + "]");
  305.          this.mPSStream.print(" /ImagingBBox null /ManualFeed false");
  306.          this.mPSStream.print(this.isCollated() ? " /Collate true" : "");
  307.          this.mPSStream.print(" /NumCopies " + this.getCopiesInt());
  308.          if (this.sidesAttr != Sides.ONE_SIDED) {
  309.             if (this.sidesAttr == Sides.TWO_SIDED_LONG_EDGE) {
  310.                this.mPSStream.print(" /Duplex true ");
  311.             } else if (this.sidesAttr == Sides.TWO_SIDED_SHORT_EDGE) {
  312.                this.mPSStream.print(" /Duplex true /Tumble true ");
  313.             }
  314.          }
  315.  
  316.          this.mPSStream.println(" >> setpagedevice ");
  317.       }
  318.  
  319.       this.mPSStream.println("%%EndSetup");
  320.    }
  321.  
  322.    protected void abortDoc() {
  323.       if (this.mPSStream != null && this.mDestType != 2) {
  324.          this.mPSStream.close();
  325.       }
  326.  
  327.       AccessController.doPrivileged(new 2(this));
  328.    }
  329.  
  330.    protected void endDoc() throws PrinterException {
  331.       if (this.mPSStream != null) {
  332.          this.mPSStream.println("%%EOF");
  333.          this.mPSStream.flush();
  334.          if (this.mDestType != 2) {
  335.             this.mPSStream.close();
  336.          }
  337.       }
  338.  
  339.       if (this.mDestType == 0) {
  340.          if (this.getPrintService() != null) {
  341.             this.mDestination = this.getPrintService().getName();
  342.          }
  343.  
  344.          PrinterSpooler var1 = new PrinterSpooler(this, (1)null);
  345.          AccessController.doPrivileged(var1);
  346.          if (var1.pex != null) {
  347.             throw var1.pex;
  348.          }
  349.       }
  350.  
  351.    }
  352.  
  353.    protected void startPage(PageFormat var1, Printable var2, int var3) throws PrinterException {
  354.       double var4 = var1.getPaper().getHeight();
  355.       double var6 = var1.getPaper().getWidth();
  356.       int var8 = var3 + 1;
  357.       this.mGStateStack = new ArrayList();
  358.       this.mGStateStack.add(new GState(this));
  359.       this.mPSStream.println("%%Page: " + var8 + " " + var8);
  360.       if (var3 > 0) {
  361.          PageFormat var9 = this.getPageable().getPageFormat(var3 - 1);
  362.          double var10 = var9.getPaper().getHeight();
  363.          double var12 = var9.getPaper().getWidth();
  364.          if (var4 != var10 || var6 != var12) {
  365.             this.mPSStream.print("<< /DeferredMediaSelection true /PageSize [" + var6 + " " + var4 + "]");
  366.             this.mPSStream.println(" >> setpagedevice");
  367.          }
  368.       }
  369.  
  370.       this.mPSStream.println("/pgSave save def");
  371.       this.mPSStream.println(var4 + " 0 exch translate 1 -1 scale[72 300 div 0 0 72 300 div 0 0]concat");
  372.    }
  373.  
  374.    protected void endPage(PageFormat var1, Printable var2, int var3) throws PrinterException {
  375.       this.mPSStream.println("pgSave restore");
  376.       this.mPSStream.println("showpage");
  377.    }
  378.  
  379.    protected void drawImageBGR(byte[] var1, float var2, float var3, float var4, float var5, float var6, float var7, float var8, float var9, int var10, int var11) {
  380.       this.setTransform(new AffineTransform());
  381.       this.prepDrawing();
  382.       int var12 = (int)var8;
  383.       int var13 = (int)var9;
  384.       this.mPSStream.println("/imSave save def");
  385.  
  386.       int var14;
  387.       for(var14 = 3 * var12; var14 > 65535; var14 /= 2) {
  388.       }
  389.  
  390.       this.mPSStream.println(var14 + " string /imStr exch def");
  391.       this.mPSStream.println("[" + var4 + " 0 " + "0 " + var5 + " " + var2 + " " + var3 + "]concat");
  392.       this.mPSStream.println(var12 + " " + var13 + " " + 8 + "[" + var12 + " 0 " + "0 " + var13 + " 0 " + 0 + "]" + "/imageSrc load false 3 colorimage");
  393.       int var15 = 0;
  394.       byte[] var16 = new byte[var12 * 3];
  395.  
  396.       try {
  397.          var15 = (int)var7 * var10;
  398.  
  399.          for(int var17 = 0; var17 < var13; ++var17) {
  400.             var15 += (int)var6;
  401.             var15 = swapBGRtoRGB(var1, var15, var16);
  402.             byte[] var18 = this.rlEncode(var16);
  403.             byte[] var19 = this.ascii85Encode(var18);
  404.             this.mPSStream.write(var19);
  405.             this.mPSStream.println("");
  406.          }
  407.       } catch (IOException var20) {
  408.       }
  409.  
  410.       this.mPSStream.println("imSave restore");
  411.    }
  412.  
  413.    protected void printBand(byte[] var1, int var2, int var3, int var4, int var5) throws PrinterException {
  414.       this.mPSStream.println("/imSave save def");
  415.  
  416.       int var6;
  417.       for(var6 = 3 * var4; var6 > 65535; var6 /= 2) {
  418.       }
  419.  
  420.       this.mPSStream.println(var6 + " string /imStr exch def");
  421.       this.mPSStream.println("[" + var4 + " 0 " + "0 " + var5 + " " + var2 + " " + var3 + "]concat");
  422.       this.mPSStream.println(var4 + " " + var5 + " " + 8 + "[" + var4 + " 0 " + "0 " + -var5 + " 0 " + var5 + "]" + "/imageSrc load false 3 colorimage");
  423.       int var7 = 0;
  424.       byte[] var8 = new byte[var4 * 3];
  425.  
  426.       try {
  427.          for(int var9 = 0; var9 < var5; ++var9) {
  428.             var7 = swapBGRtoRGB(var1, var7, var8);
  429.             byte[] var10 = this.rlEncode(var8);
  430.             byte[] var11 = this.ascii85Encode(var10);
  431.             this.mPSStream.write(var11);
  432.             this.mPSStream.println("");
  433.          }
  434.       } catch (IOException var12) {
  435.          throw new PrinterIOException(var12);
  436.       }
  437.  
  438.       this.mPSStream.println("imSave restore");
  439.    }
  440.  
  441.    protected Graphics2D createPathGraphics(PeekGraphics var1, PrinterJob var2, Printable var3, PageFormat var4, int var5) {
  442.       PeekMetrics var7 = var1.getMetrics();
  443.       PSPathGraphics var6;
  444.       if (forcePDL || !forceRaster && !var7.hasNonSolidColors() && !var7.hasCompositing()) {
  445.          BufferedImage var8 = new BufferedImage(8, 8, 1);
  446.          Graphics2D var9 = var8.createGraphics();
  447.          boolean var10 = !var1.getAWTDrawingOnly();
  448.          var6 = new PSPathGraphics(var9, var2, var3, var4, var5, var10);
  449.       } else {
  450.          var6 = null;
  451.       }
  452.  
  453.       return var6;
  454.    }
  455.  
  456.    protected void selectClipPath() {
  457.       this.mPSStream.println(this.mClipOpStr);
  458.    }
  459.  
  460.    protected void setClip(Shape var1) {
  461.       this.mLastClip = var1;
  462.    }
  463.  
  464.    protected void setTransform(AffineTransform var1) {
  465.       this.mLastTransform = var1;
  466.    }
  467.  
  468.    protected boolean setFont(Font var1) {
  469.       this.mLastFont = var1;
  470.       return true;
  471.    }
  472.  
  473.    private int[] getPSFontIndexArray(Font var1, CharsetString[] var2) {
  474.       int[] var3 = null;
  475.       if (mFontProps != null) {
  476.          var3 = new int[var2.length];
  477.       }
  478.  
  479.       for(int var4 = 0; var4 < var2.length && var3 != null; ++var4) {
  480.          CharsetString var5 = var2[var4];
  481.          CharsetEncoder var6 = var5.fontDescriptor.encoder;
  482.          String var7 = var5.fontDescriptor.getFontCharsetName();
  483.          if ("Symbol".equals(var7)) {
  484.             var7 = "symbol";
  485.          } else if (!"WingDings".equals(var7) && !"X11Dingbats".equals(var7)) {
  486.             var7 = this.makeCharsetName(var7, var5.charsetChars);
  487.          } else {
  488.             var7 = "dingbats";
  489.          }
  490.  
  491.          int var8 = var1.getStyle() | FontManager.getFont2D(var1).getStyle();
  492.          String var9 = FontConfiguration.getStyleString(var8);
  493.          String var10 = var1.getFamily().toLowerCase(Locale.ENGLISH);
  494.          var10 = var10.replace(' ', '_');
  495.          String var11 = mFontProps.getProperty(var10, "");
  496.          String var12 = mFontProps.getProperty(var11 + "." + var7 + "." + var9, (String)null);
  497.          if (var12 != null) {
  498.             try {
  499.                var3[var4] = Integer.parseInt(mFontProps.getProperty(var12));
  500.             } catch (NumberFormatException var14) {
  501.                var3 = null;
  502.             }
  503.          } else {
  504.             var3 = null;
  505.          }
  506.       }
  507.  
  508.       return var3;
  509.    }
  510.  
  511.    private static String escapeParens(String var0) {
  512.       if (var0.indexOf(40) == -1 && var0.indexOf(41) == -1) {
  513.          return var0;
  514.       } else {
  515.          int var1 = 0;
  516.  
  517.          for(int var6 = 0; (var6 = var0.indexOf(40, var6)) != -1; ++var6) {
  518.             ++var1;
  519.          }
  520.  
  521.          for(int var8 = 0; (var8 = var0.indexOf(41, var8)) != -1; ++var8) {
  522.             ++var1;
  523.          }
  524.  
  525.          char[] var3 = var0.toCharArray();
  526.          char[] var4 = new char[var3.length + var1];
  527.          int var9 = 0;
  528.  
  529.          for(int var5 = 0; var5 < var3.length; ++var5) {
  530.             if (var3[var5] == '(' || var3[var5] == ')') {
  531.                var4[var9++] = '\\';
  532.             }
  533.  
  534.             var4[var9++] = var3[var5];
  535.          }
  536.  
  537.          return new String(var4);
  538.       }
  539.    }
  540.  
  541.    protected int platformFontCount(Font var1, String var2) {
  542.       if (mFontProps == null) {
  543.          return 0;
  544.       } else {
  545.          CharsetString[] var3 = ((PlatformFont)((PlatformFont)var1.getPeer())).makeMultiCharsetString(var2, false);
  546.          if (var3 == null) {
  547.             return 0;
  548.          } else {
  549.             int[] var4 = this.getPSFontIndexArray(var1, var3);
  550.             return var4 == null ? 0 : var4.length;
  551.          }
  552.       }
  553.    }
  554.  
  555.    protected boolean textOut(Graphics var1, String var2, float var3, float var4, Font var5, FontRenderContext var6, float var7) {
  556.       boolean var8 = true;
  557.       if (mFontProps == null) {
  558.          return false;
  559.       } else {
  560.          this.prepDrawing();
  561.          var2 = this.removeControlChars(var2);
  562.          if (var2.length() == 0) {
  563.             return true;
  564.          } else {
  565.             CharsetString[] var9 = ((PlatformFont)((PlatformFont)var5.getPeer())).makeMultiCharsetString(var2, false);
  566.             if (var9 == null) {
  567.                return false;
  568.             } else {
  569.                int[] var10 = this.getPSFontIndexArray(var5, var9);
  570.                if (var10 != null) {
  571.                   for(int var11 = 0; var11 < var9.length; ++var11) {
  572.                      CharsetString var12 = var9[var11];
  573.                      CharsetEncoder var13 = var12.fontDescriptor.encoder;
  574.                      StringBuffer var14 = new StringBuffer();
  575.                      byte[] var15 = new byte[var12.length * 2];
  576.                      int var16 = 0;
  577.  
  578.                      try {
  579.                         ByteBuffer var17 = ByteBuffer.wrap(var15);
  580.                         var13.encode(CharBuffer.wrap(var12.charsetChars, var12.offset, var12.length), var17, true);
  581.                         var17.flip();
  582.                         var16 = var17.limit();
  583.                      } catch (IllegalStateException var22) {
  584.                         continue;
  585.                      } catch (CoderMalfunctionError var23) {
  586.                         continue;
  587.                      }
  588.  
  589.                      float var26;
  590.                      if (var9.length == 1 && var7 != 0.0F) {
  591.                         var26 = var7;
  592.                      } else {
  593.                         Rectangle2D var18 = var5.getStringBounds(var12.charsetChars, var12.offset, var12.offset + var12.length, var6);
  594.                         var26 = (float)var18.getWidth();
  595.                      }
  596.  
  597.                      if (var26 == 0.0F) {
  598.                         return var8;
  599.                      }
  600.  
  601.                      var14.append('<');
  602.  
  603.                      for(int var27 = 0; var27 < var16; ++var27) {
  604.                         byte var19 = var15[var27];
  605.                         String var20 = Integer.toHexString(var19);
  606.                         int var21 = var20.length();
  607.                         if (var21 > 2) {
  608.                            var20 = var20.substring(var21 - 2, var21);
  609.                         } else if (var21 == 1) {
  610.                            var20 = "0" + var20;
  611.                         } else if (var21 == 0) {
  612.                            var20 = "00";
  613.                         }
  614.  
  615.                         var14.append(var20);
  616.                      }
  617.  
  618.                      var14.append('>');
  619.                      this.getGState().emitPSFont(var10[var11], var5.getSize2D());
  620.                      this.mPSStream.println(var14.toString() + " " + var26 + " " + var3 + " " + var4 + " " + "S");
  621.                      var3 += var26;
  622.                   }
  623.                } else {
  624.                   var8 = false;
  625.                }
  626.  
  627.                return var8;
  628.             }
  629.          }
  630.       }
  631.    }
  632.  
  633.    protected void setFillMode(int var1) {
  634.       switch (var1) {
  635.          case 1:
  636.             this.mFillOpStr = "EF";
  637.             this.mClipOpStr = "EC";
  638.             break;
  639.          case 2:
  640.             this.mFillOpStr = "WF";
  641.             this.mClipOpStr = "WC";
  642.             break;
  643.          default:
  644.             throw new IllegalArgumentException();
  645.       }
  646.  
  647.    }
  648.  
  649.    protected void setColor(Color var1) {
  650.       this.mLastColor = var1;
  651.    }
  652.  
  653.    protected void fillPath() {
  654.       this.mPSStream.println(this.mFillOpStr);
  655.    }
  656.  
  657.    protected void beginPath() {
  658.       this.prepDrawing();
  659.       this.mPSStream.println("N");
  660.       this.mPenX = 0.0F;
  661.       this.mPenY = 0.0F;
  662.    }
  663.  
  664.    protected void closeSubpath() {
  665.       this.mPSStream.println("P");
  666.       this.mPenX = this.mStartPathX;
  667.       this.mPenY = this.mStartPathY;
  668.    }
  669.  
  670.    protected void moveTo(float var1, float var2) {
  671.       this.mPSStream.println(this.trunc(var1) + " " + this.trunc(var2) + " M");
  672.       this.mStartPathX = var1;
  673.       this.mStartPathY = var2;
  674.       this.mPenX = var1;
  675.       this.mPenY = var2;
  676.    }
  677.  
  678.    protected void lineTo(float var1, float var2) {
  679.       this.mPSStream.println(this.trunc(var1) + " " + this.trunc(var2) + " L");
  680.       this.mPenX = var1;
  681.       this.mPenY = var2;
  682.    }
  683.  
  684.    protected void bezierTo(float var1, float var2, float var3, float var4, float var5, float var6) {
  685.       this.mPSStream.println(this.trunc(var1) + " " + this.trunc(var2) + " " + this.trunc(var3) + " " + this.trunc(var4) + " " + this.trunc(var5) + " " + this.trunc(var6) + " C");
  686.       this.mPenX = var5;
  687.       this.mPenY = var6;
  688.    }
  689.  
  690.    String trunc(float var1) {
  691.       float var2 = Math.abs(var1);
  692.       if (var2 >= 1.0F && var2 <= 1000.0F) {
  693.          var1 = (float)Math.round(var1 * 1000.0F) / 1000.0F;
  694.       }
  695.  
  696.       return Float.toString(var1);
  697.    }
  698.  
  699.    protected float getPenX() {
  700.       return this.mPenX;
  701.    }
  702.  
  703.    protected float getPenY() {
  704.       return this.mPenY;
  705.    }
  706.  
  707.    protected double getXRes() {
  708.       return (double)300.0F;
  709.    }
  710.  
  711.    protected double getYRes() {
  712.       return (double)300.0F;
  713.    }
  714.  
  715.    protected double getPhysicalPrintableX(Paper var1) {
  716.       return (double)0.0F;
  717.    }
  718.  
  719.    protected double getPhysicalPrintableY(Paper var1) {
  720.       return (double)0.0F;
  721.    }
  722.  
  723.    protected double getPhysicalPrintableWidth(Paper var1) {
  724.       return var1.getImageableWidth();
  725.    }
  726.  
  727.    protected double getPhysicalPrintableHeight(Paper var1) {
  728.       return var1.getImageableHeight();
  729.    }
  730.  
  731.    protected double getPhysicalPageWidth(Paper var1) {
  732.       return var1.getWidth();
  733.    }
  734.  
  735.    protected double getPhysicalPageHeight(Paper var1) {
  736.       return var1.getHeight();
  737.    }
  738.  
  739.    protected int getNoncollatedCopies() {
  740.       return 1;
  741.    }
  742.  
  743.    protected int getCollatedCopies() {
  744.       return 1;
  745.    }
  746.  
  747.    private String[] printExecCmd(String var1, String var2, boolean var3, String var4, int var5, String var6) {
  748.       boolean var7 = true;
  749.       boolean var8 = true;
  750.       boolean var9 = true;
  751.       boolean var10 = true;
  752.       boolean var11 = true;
  753.       boolean var12 = false;
  754.       int var14 = 2;
  755.       int var15 = 0;
  756.       if (var1 != null && !var1.equals("") && !var1.equals("lp")) {
  757.          var12 |= var7;
  758.          ++var14;
  759.       }
  760.  
  761.       if (var2 != null && !var2.equals("")) {
  762.          var12 |= var8;
  763.          ++var14;
  764.       }
  765.  
  766.       if (var4 != null && !var4.equals("")) {
  767.          var12 |= var9;
  768.          ++var14;
  769.       }
  770.  
  771.       if (var5 > 1) {
  772.          var12 |= var10;
  773.          ++var14;
  774.       }
  775.  
  776.       if (var3) {
  777.          var12 |= var11;
  778.          ++var14;
  779.       }
  780.  
  781.       String[] var13;
  782.       if (System.getProperty("os.name").equals("Linux")) {
  783.          var13 = new String[var14];
  784.          var13[var15++] = "/usr/bin/lpr";
  785.          if (var12 & var7) {
  786.             var13[var15++] = new String("-P" + var1);
  787.          }
  788.  
  789.          if (var12 & var9) {
  790.             var13[var15++] = new String("-J" + var4);
  791.          }
  792.  
  793.          if (var12 & var10) {
  794.             var13[var15++] = new String("-#" + (new Integer(var5)).toString());
  795.          }
  796.  
  797.          if (var12 & var11) {
  798.             var13[var15++] = new String("-h");
  799.          }
  800.  
  801.          if (var12 & var8) {
  802.             var13[var15++] = new String(var2);
  803.          }
  804.       } else {
  805.          ++var14;
  806.          var13 = new String[var14];
  807.          var13[var15++] = "/usr/bin/lp";
  808.          var13[var15++] = "-c";
  809.          if (var12 & var7) {
  810.             var13[var15++] = new String("-d" + var1);
  811.          }
  812.  
  813.          if (var12 & var9) {
  814.             var13[var15++] = new String("-t" + var4);
  815.          }
  816.  
  817.          if (var12 & var10) {
  818.             var13[var15++] = new String("-n" + (new Integer(var5)).toString());
  819.          }
  820.  
  821.          if (var12 & var11) {
  822.             var13[var15++] = new String("-o nobanner");
  823.          }
  824.  
  825.          if (var12 & var8) {
  826.             var13[var15++] = new String("-o" + var2);
  827.          }
  828.       }
  829.  
  830.       var13[var15++] = var6;
  831.       return var13;
  832.    }
  833.  
  834.    private static int swapBGRtoRGB(byte[] var0, int var1, byte[] var2) {
  835.       for(int var3 = 0; var1 < var0.length - 2 && var3 < var2.length - 2; var1 += 3) {
  836.          var2[var3++] = var0[var1 + 2];
  837.          var2[var3++] = var0[var1 + 1];
  838.          var2[var3++] = var0[var1 + 0];
  839.       }
  840.  
  841.       return var1;
  842.    }
  843.  
  844.    private String makeCharsetName(String var1, char[] var2) {
  845.       if (!var1.equals("Cp1252") && !var1.equals("ISO8859_1")) {
  846.          if (var1.equals("UTF8")) {
  847.             for(int var4 = 0; var4 < var2.length; ++var4) {
  848.                if (var2[var4] > 255) {
  849.                   return var1.toLowerCase();
  850.                }
  851.             }
  852.  
  853.             return "latin1";
  854.          } else if (var1.startsWith("ISO8859")) {
  855.             for(int var3 = 0; var3 < var2.length; ++var3) {
  856.                if (var2[var3] > 127) {
  857.                   return var1.toLowerCase();
  858.                }
  859.             }
  860.  
  861.             return "latin1";
  862.          } else {
  863.             return var1.toLowerCase();
  864.          }
  865.       } else {
  866.          return "latin1";
  867.       }
  868.    }
  869.  
  870.    private void prepDrawing() {
  871.       while(!this.isOuterGState() && (!this.getGState().canSetClip(this.mLastClip) || !this.getGState().mTransform.equals(this.mLastTransform))) {
  872.          this.grestore();
  873.       }
  874.  
  875.       this.getGState().emitPSColor(this.mLastColor);
  876.       if (this.isOuterGState()) {
  877.          this.gsave();
  878.          this.getGState().emitTransform(this.mLastTransform);
  879.          this.getGState().emitPSClip(this.mLastClip);
  880.       }
  881.  
  882.    }
  883.  
  884.    private GState getGState() {
  885.       int var1 = this.mGStateStack.size();
  886.       return (GState)this.mGStateStack.get(var1 - 1);
  887.    }
  888.  
  889.    private void gsave() {
  890.       GState var1 = this.getGState();
  891.       this.mGStateStack.add(new GState(this, var1));
  892.       this.mPSStream.println("G");
  893.    }
  894.  
  895.    private void grestore() {
  896.       int var1 = this.mGStateStack.size();
  897.       this.mGStateStack.remove(var1 - 1);
  898.       this.mPSStream.println("R");
  899.    }
  900.  
  901.    private boolean isOuterGState() {
  902.       return this.mGStateStack.size() == 1;
  903.    }
  904.  
  905.    void convertToPSPath(PathIterator var1) {
  906.       float[] var2 = new float[6];
  907.       byte var4;
  908.       if (var1.getWindingRule() == 0) {
  909.          var4 = 1;
  910.       } else {
  911.          var4 = 2;
  912.       }
  913.  
  914.       this.beginPath();
  915.       this.setFillMode(var4);
  916.  
  917.       for(; !var1.isDone(); var1.next()) {
  918.          int var3 = var1.currentSegment(var2);
  919.          switch (var3) {
  920.             case 0:
  921.                this.moveTo(var2[0], var2[1]);
  922.                break;
  923.             case 1:
  924.                this.lineTo(var2[0], var2[1]);
  925.                break;
  926.             case 2:
  927.                float var5 = this.getPenX();
  928.                float var6 = this.getPenY();
  929.                float var7 = var5 + (var2[0] - var5) * 2.0F / 3.0F;
  930.                float var8 = var6 + (var2[1] - var6) * 2.0F / 3.0F;
  931.                float var9 = var2[2] - (var2[2] - var2[0]) * 2.0F / 3.0F;
  932.                float var10 = var2[3] - (var2[3] - var2[1]) * 2.0F / 3.0F;
  933.                this.bezierTo(var7, var8, var9, var10, var2[2], var2[3]);
  934.                break;
  935.             case 3:
  936.                this.bezierTo(var2[0], var2[1], var2[2], var2[3], var2[4], var2[5]);
  937.                break;
  938.             case 4:
  939.                this.closeSubpath();
  940.          }
  941.       }
  942.  
  943.    }
  944.  
  945.    protected void deviceFill(PathIterator var1, Color var2, AffineTransform var3, Shape var4) {
  946.       this.setTransform(var3);
  947.       this.setClip(var4);
  948.       this.setColor(var2);
  949.       this.convertToPSPath(var1);
  950.       this.mPSStream.println("G");
  951.       this.selectClipPath();
  952.       this.fillPath();
  953.       this.mPSStream.println("R N");
  954.    }
  955.  
  956.    private byte[] rlEncode(byte[] var1) {
  957.       int var2 = 0;
  958.       int var3 = 0;
  959.       int var4 = 0;
  960.       int var5 = 0;
  961.       byte[] var6 = new byte[var1.length * 2 + 2];
  962.  
  963.       while(var2 < var1.length) {
  964.          if (var5 == 0) {
  965.             var4 = var2++;
  966.             var5 = 1;
  967.          }
  968.  
  969.          while(var5 < 128 && var2 < var1.length && var1[var2] == var1[var4]) {
  970.             ++var5;
  971.             ++var2;
  972.          }
  973.  
  974.          if (var5 > 1) {
  975.             var6[var3++] = (byte)(257 - var5);
  976.             var6[var3++] = var1[var4];
  977.             var5 = 0;
  978.          } else {
  979.             while(var5 < 128 && var2 < var1.length && var1[var2] != var1[var2 - 1]) {
  980.                ++var5;
  981.                ++var2;
  982.             }
  983.  
  984.             var6[var3++] = (byte)(var5 - 1);
  985.  
  986.             for(int var7 = var4; var7 < var4 + var5; ++var7) {
  987.                var6[var3++] = var1[var7];
  988.             }
  989.  
  990.             var5 = 0;
  991.          }
  992.       }
  993.  
  994.       var6[var3++] = -128;
  995.       byte[] var10 = new byte[var3];
  996.       System.arraycopy(var6, 0, var10, 0, var3);
  997.       return var10;
  998.    }
  999.  
  1000.    private byte[] ascii85Encode(byte[] var1) {
  1001.       byte[] var2 = new byte[(var1.length + 4) * 5 / 4 + 2];
  1002.       long var3 = 85L;
  1003.       long var5 = var3 * var3;
  1004.       long var7 = var3 * var5;
  1005.       long var9 = var3 * var7;
  1006.       byte var11 = 33;
  1007.       int var12 = 0;
  1008.       int var13 = 0;
  1009.  
  1010.       while(var12 + 3 < var1.length) {
  1011.          long var14 = ((long)(var1[var12++] & 255) << 24) + ((long)(var1[var12++] & 255) << 16) + ((long)(var1[var12++] & 255) << 8) + (long)(var1[var12++] & 255);
  1012.          if (var14 == 0L) {
  1013.             var2[var13++] = 122;
  1014.          } else {
  1015.             var2[var13++] = (byte)((int)(var14 / var9 + (long)var11));
  1016.             long var16 = var14 % var9;
  1017.             var2[var13++] = (byte)((int)(var16 / var7 + (long)var11));
  1018.             var16 %= var7;
  1019.             var2[var13++] = (byte)((int)(var16 / var5 + (long)var11));
  1020.             var16 %= var5;
  1021.             var2[var13++] = (byte)((int)(var16 / var3 + (long)var11));
  1022.             var16 %= var3;
  1023.             var2[var13++] = (byte)((int)(var16 + (long)var11));
  1024.          }
  1025.       }
  1026.  
  1027.       if (var12 < var1.length) {
  1028.          int var18 = var1.length - var12;
  1029.  
  1030.          long var31;
  1031.          for(var31 = 0L; var12 < var1.length; var31 = (var31 << 8) + (long)(var1[var12++] & 255)) {
  1032.          }
  1033.  
  1034.          for(int var19 = 4 - var18; var19-- > 0; var31 <<= 8) {
  1035.          }
  1036.  
  1037.          byte[] var20 = new byte[5];
  1038.          var20[0] = (byte)((int)(var31 / var9 + (long)var11));
  1039.          long var35 = var31 % var9;
  1040.          var20[1] = (byte)((int)(var35 / var7 + (long)var11));
  1041.          var35 %= var7;
  1042.          var20[2] = (byte)((int)(var35 / var5 + (long)var11));
  1043.          var35 %= var5;
  1044.          var20[3] = (byte)((int)(var35 / var3 + (long)var11));
  1045.          var35 %= var3;
  1046.          var20[4] = (byte)((int)(var35 + (long)var11));
  1047.  
  1048.          for(int var21 = 0; var21 < var18 + 1; ++var21) {
  1049.             var2[var13++] = var20[var21];
  1050.          }
  1051.       }
  1052.  
  1053.       var2[var13++] = 126;
  1054.       var2[var13++] = 62;
  1055.       byte[] var39 = new byte[var13];
  1056.       System.arraycopy(var2, 0, var39, 0, var13);
  1057.       return var39;
  1058.    }
  1059.  
  1060.    // $FF: synthetic method
  1061.    static Properties access$002(Properties var0) {
  1062.       mFontProps = var0;
  1063.       return var0;
  1064.    }
  1065.  
  1066.    // $FF: synthetic method
  1067.    static Properties access$100() {
  1068.       return initProps();
  1069.    }
  1070.  
  1071.    // $FF: synthetic method
  1072.    static String access$300(PSPrinterJob var0) {
  1073.       return var0.mDestination;
  1074.    }
  1075.  
  1076.    // $FF: synthetic method
  1077.    static String access$400(PSPrinterJob var0) {
  1078.       return var0.mOptions;
  1079.    }
  1080.  
  1081.    // $FF: synthetic method
  1082.    static boolean access$500(PSPrinterJob var0) {
  1083.       return var0.mNoJobSheet;
  1084.    }
  1085.  
  1086.    // $FF: synthetic method
  1087.    static String[] access$600(PSPrinterJob var0, String var1, String var2, boolean var3, String var4, int var5, String var6) {
  1088.       return var0.printExecCmd(var1, var2, var3, var4, var5, var6);
  1089.    }
  1090.  
  1091.    // $FF: synthetic method
  1092.    static String access$800(PSPrinterJob var0) {
  1093.       return var0.mFillOpStr;
  1094.    }
  1095.  
  1096.    // $FF: synthetic method
  1097.    static String access$900(PSPrinterJob var0) {
  1098.       return var0.mClipOpStr;
  1099.    }
  1100.  
  1101.    // $FF: synthetic method
  1102.    static String access$902(PSPrinterJob var0, String var1) {
  1103.       return var0.mClipOpStr = var1;
  1104.    }
  1105.  
  1106.    // $FF: synthetic method
  1107.    static String access$802(PSPrinterJob var0, String var1) {
  1108.       return var0.mFillOpStr = var1;
  1109.    }
  1110.  
  1111.    // $FF: synthetic method
  1112.    static EPSPrinter access$1002(PSPrinterJob var0, EPSPrinter var1) {
  1113.       return var0.epsPrinter = var1;
  1114.    }
  1115.  
  1116.    // $FF: synthetic method
  1117.    static int access$1102(PSPrinterJob var0, int var1) {
  1118.       return var0.mDestType = var1;
  1119.    }
  1120.  
  1121.    static {
  1122.       AccessController.doPrivileged(new 1());
  1123.    }
  1124. }
  1125.